#include <iostream>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <sys/stat.h>

#define ROOT "/"
#define devnull "/dev/null"

class Deamon
{
public:
    Deamon(bool ischdir, bool isclose)
    {
        // 屏蔽信号
        signal(SIGCHLD, SIG_IGN);
        signal(SIGPIPE, SIG_IGN);

        // 成为非组长
        if (fork() > 0)
        {
            exit(0);
        }
        // 创建新会话
        if (setsid() < 0)
        {
            perror("setsid");
            exit(1);
        }

        // 每一个进程都有自己的CWD，是否将当前进程的CWD更改成为 / 根目录
        if (ischdir)
            chdir(ROOT);
        //已经变成守护进程啦，不需要和用户的输入输出，错误进行关联了
        if (isclose)
        {
            ::close(0);
            ::close(1);
            ::close(2);
        }
        else
        {
            int fd = ::open(devnull, O_WRONLY);
            if (fd > 0)
            {
                // 各种重定向
                dup2(fd, 0);
                dup2(fd, 1);
                dup2(fd, 2);
                close(fd);
            }
        }
    }
};